vim
1.3k 词
首先,介绍下环境:neovim,mac 插件管理vim-plugNeovimUnix, Linux12sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' Linux (Flatpak)12curl -fLo ~/.var/app/io.neovim.nvim/data/nvim/site/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim Windows (PowerShell)12iwr -useb https://raw.githubusercontent.com/ju...
1k 词
一、缘起很多时候,业务有“在一段时间之后,完成一个工作任务”的需求。例如:滴滴打车订单完成后,如果用户一直不评价,48小时后会将自动评价为5星。一般来说怎么实现这类“48小时后自动评价为5星”需求呢?常见方案:启动一个cron定时任务,每小时跑一次,将完成时间超过48小时的订单取出,置为5星,并把评价状态置为已评价。假设订单表的结构为:t_order(oid, finish_time, stars, status, …),更具体的,定时任务每隔一个小时会这么做一次:select oid from t_order where finish_time > 48hours and status=0;update t_order set stars=5 and status=1 where oid in[…];如果数据量很大,需要分页查询,分页update,这将会是一个for循环。方案的不足:(1)轮询效率比较低(2)每次扫库,已经被执行过记录,仍然会被扫描(只是不会出现在结果集中),有重复计算的嫌疑(3)时效性不够好,如果每小时轮询一次,最差的情况下...
4.6k 词
sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。那么,如何优化sql语句呢?这篇文章从15个方面,分享了sql优化的一些小技巧,希望对你有所帮助。 1 避免使用select *很多时候,我们写sql语句时,为了方便,喜欢直接使用select *,一次性查出表中所有列的数据。反例: 1select * from user where id=1; 在实际业务场景中,可能我们真正需要使用的只有其中一两列。查了很多数据,但是不用,白白浪费了数据库资源,比如:内存或者cpu。此外,多查出来的数据,通过网络IO传输的过程中,也会增加数据传输的时间。还有一个重要的问题是:select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。那么,如何优化呢?正例: 1select name,age from user where id=1; sql语句查询时,只查需要用到的列,多余的列根本无需查出来。 ...
2k 词
wire 简介Wire 是一种代码生成工具,其使用依赖注入自动连接组件。在 Wire 中,组件之间的依赖关系是通过函数参数来表示的。组件 B 依赖组件 A,那么构造组件 B 的函数大致需要定义为:NewB(a A) B。这里,鼓励显式初始化组件 A,而不是,定义一个组件 A 全局变量,然后不通过传参而直接在 NewB 函数中使用全局变量。 wire 安装1go get github.com/google/wire/cmd/wire 确保 $GOPATH/bin 已添加到 $PATH 环境变量。 wire 基础概念在 wire 中,有两个核心概念:Providers、Injectors。 Providerswire 的主要机制是 Provider:具有返回值的函数。这些函数都是常规的 go 代码。 12345678910package foobarbaztype Foo struct { X int}// ProvideFoo 函数返回一个 Foo 结构体值。func ProvideFoo() Foo { return Foo&#...
817 词
影响Oracle WebLogic Server product of Oracle Fusion Middleware (component: Core) 12.2.1.3.0 12.2.1.4.0 14.1.1.0.0 原理根据nvd的描述能够轻易的通过发送T3协议给weblogic服务造成JNDI的注入这里的漏洞点和之前的CVE-2023-21839的成因感觉上是很像的,CVE-2023-21839主要是因weblogic的t3 / iiop协议支持远程绑定对象bind / rebind到服务端,之后在调用lookup的过程中,存在有参数可控的lookup的调用,也即是weblogic.deployment.jms.ForeignOpaqueReference#getReferent中代码而对于昨天公开的CVE-2023-21931这个漏洞,同样和上一次CVE一样,是在lookup的调用过程中存在有一个可控的lookup方法调用造成了一个JNDI注入,即是通过LinkRef#getLinkName方法来获取ldap查询串,具体的分析见下文 分析前面提...
2k 词
使用Go可以轻松地为每一个TCP连接创建一个协程去服务而不用担心性能问题,这是因为Go内部使用goroutine结合IO多路复用实现了一个“异步”的IO模型,这使得开发者不用过多的关注底层,而只需要按照需求编写上层业务逻辑。这种异步的IO是如何实现的呢?下面我会针对Linux系统进行分析。在Unix/Linux系统下,一切皆文件,每条TCP连接对应了一个socket句柄,这个句柄也可以看做是一个文件,在socket上收发数据,相当于对一个文件进行读写,所以一个socket句柄,通常也用表示文件描述符fd来表示。可以进入/proc/PID/fd/查看进程占用的fd。系统内核会为每个socket句柄分配一个读(接收)缓冲区和一个写(发送)缓冲区,发送数据就是在这个fd对应的写缓冲区上写数据,而接收数据就是在读缓冲区上读数据,当程序调用write或者send时,并不代表数据发送出去,仅仅是把数据拷贝到了写缓冲区,在时机恰当时候(积累到一定数量),会将数据发送到目的端。Golang runtime还是需要频繁去检查是否有fd就绪的,严格说...
1.4k 词
本文主要介绍Go语言中的singleflight包,包括什么是singleflight以及如何使用singleflight合并请求解决缓存击穿问题。 singleflight 目前(Go1.20)还属于Go的准标准库,它提供了重复函数调用抑制机制,使用它可以避免同时进行相同的函数调用。第一个调用未完成时后续的重复调用会等待,当第一个调用完成时则会与它们分享结果,这样以来虽然只执行了一次函数调用但是所有调用都拿到了最终的调用结果。 基础示例我们首先来看以下示例代码,在第1次调用getData函数没返回结果时,再次调用getData函数。 1234567891011121314151617181920212223242526272829303132333435package mainimport ( "fmt" "golang.org/x/sync/singleflight" "time")func getData(id int64) string { fmt.Println("query..."...
3.3k 词
Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基础概念Go在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址空间,并不会真正地分配内存),切成小块后自己进行管理。申请到的内存块被分配了三个区域,在X64上分别是512MB,16GB,512GB大小。arena区域就是我们所谓的堆区,Go动态分配的内存都是在这个区域,它把内存分割成8KB大小的页,一些页组合起来称为mspan。bitmap区域标识arena区域哪些地址保存了对象,并且用4bi...
694 词
性能调优性能优化建议 slice和map预分配空间性能会更好。 字符串处理 使用 + 拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Builder更快 分析 字符串在Go语言中是不可变类型,占用内存大小是固定的 使用 + 每次都会重新分配内存 strings.Builder,bytes.Buffer底层都是[]byte数组 内存扩容策略,不需要每次拼接重新分配内存 使用空结构体节省内存 空结构体struct{}实例不占据任何的内存空间,可作为各场景下的占位符使用 节省资源 空结构体本身具备很强的语义,即这里不需要任何值,仅作为占位符 使用atomatic包 锁的实现是通过操作系统,属于系统调用 atomatic操作是通过硬件实现的,效率比锁高 sync.Mutex应该用来保护一段逻辑,而不仅仅用于保护一个变量 对于非数值操作,可以用atomatic.Value,承载一个interface{} 性能调优原则 要依靠数据不是猜测 要定位最大瓶颈而不是细枝末节 不要过早优化 不要过度优化 性能分析工具...
439 词
介绍 Go语⾔中,不要通过共享内存来通信,⽽要通过通信来实现内存共享。Go的 CSP(Communicating Sequential Process)并发模型,中⽂可以叫做通信顺序进程,是通过 goroutine 和 channel 来实现的。所以 channel 收发遵循先进先出 FIFO,分为有缓存和⽆缓存,channel 中⼤致有 buffer(当缓冲区⼤⼩部位0 时, 是个 ring buffer)、sendx 和 recvx 收发的位置(ring buffer 记录实现)、sendq、recvq 当前 channel 因为缓冲区不⾜⽽阻塞的队列、使⽤双向链表存储、还有⼀个 mutex 锁控制并发、其他原属等。 向channel写入数据和从channel里面读数据都是原子性的,所以channel是并发安全的。 channel的特性 给⼀个 nil channel 发送数据,造成永远阻塞 从⼀个 nil channel 接收数据,造成永远阻塞 给⼀个已经关闭的 channel 发送数据,引起 panic 从⼀个已经关闭的 channel 接收数据,如果缓冲区中为空...